package br.com.rhinovet.dao.unitario.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import br.com.rhinovet.dao.generico.DaoGenerico;
import br.com.rhinovet.dao.unitario.contract.ProcedimentoConsultaDaoContract;
import br.com.rhinovet.entidade.ProcedimentoConsulta;
import br.com.rhinovet.util.DataUtil;

@Repository("daoProcedimentoConsulta")
public class ProcedimentoConsultaDao extends DaoGenerico<ProcedimentoConsulta> implements ProcedimentoConsultaDaoContract {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	@Override
	public List<ProcedimentoConsulta> buscarProcedimentoConsultaPorConsulta(Long idConsulta) {
		
		List<ProcedimentoConsulta> listaRetorno = new ArrayList<>();
		StringBuilder sqlTotal = new StringBuilder();
		
		try {
			sqlTotal.append("select e from ProcedimentoConsulta e ");
			sqlTotal.append(" where e.consulta.id = " + idConsulta);
			sqlTotal.append(" order by e.dataProcedimento desc ");
			
			Query query = getSession().createQuery(sqlTotal.toString());
			listaRetorno = query.list();
			
		} catch (Exception e) {

			System.out.println("Erro ao buscar informacoes no dao");
		}
		
		return listaRetorno;
	}

	@Override
	public List<ProcedimentoConsulta> buscarRetornoAVencer() {
		try {
			StringBuilder sqlTotal = new StringBuilder();
			sqlTotal.append(" select e from ProcedimentoConsulta e ");
			sqlTotal.append(" where e.dataRetorno >= :dataAtual ");
			sqlTotal.append(" and e.dataRetorno <= :dezDiasAFrente ");
			
			Query query = getSession().createQuery(sqlTotal.toString());
			query.setParameter("dataAtual", new Date());
			query.setParameter("dezDiasAFrente", DataUtil.recuperaDataAutalMaisXDias(7));
			
			@SuppressWarnings("unchecked")
			List<ProcedimentoConsulta> listaRetorno = query.list();
			
			return listaRetorno;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	@Override
	public List<Integer> buscarAnosProcedimento(Long idConsulta) throws Exception {
		StringBuilder sqlTotal = new StringBuilder();
		sqlTotal.append(" SELECT distinct(YEAR(dataProcedimento)) ");
		sqlTotal.append(" FROM ProcedimentoConsulta ");
		sqlTotal.append(" where consulta_id = " + idConsulta);
		sqlTotal.append(" order by dataProcedimento desc ");
		
		Query query = getSession().createQuery(sqlTotal.toString());
		@SuppressWarnings("unchecked")
		List<Integer> listaAnos = query.list();
		
		return listaAnos;
	}
	
	@Override
	public List<ProcedimentoConsulta> buscarProcedimentosPorPeriodoPorConsulta(Long idConsulta, Date dataInicio, Date dataFinal) {
		
		StringBuilder sqlTotal = new StringBuilder();
		sqlTotal.append(" select e from ProcedimentoConsulta e ");
		sqlTotal.append(" where e.consulta.id = :idConsulta ");
		sqlTotal.append(" and e.dataProcedimento between :dataInicio and :dataFinal ");
		sqlTotal.append(" order by dataProcedimento desc ");
		
		Query query = getSession().createQuery(sqlTotal.toString());
		query.setParameter("idConsulta", idConsulta);
		query.setParameter("dataInicio", dataInicio);
		query.setParameter("dataFinal", dataFinal);
		
		@SuppressWarnings("unchecked")
		List<ProcedimentoConsulta> listaProcedimentos =  query.list();
		
		return listaProcedimentos;
		
	}

	@Override
	public ProcedimentoConsulta obterProcedimentoConsultaPorId(Long idEntidade) {
		try {
			return super.obterPorId(ProcedimentoConsulta.class, idEntidade);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


}
